#include <stdio.h>
#include <string.h>
#include <gmssl/sm3.h>
#include <stdint.h> // 包含 uint8_t

// SM3 摘要长度（256位 = 32字节）
#define SM3_HASH_SIZE 32
#define HMAC_KEY_SIZE 16

// (复用 print_hex 函数)
void print_hex(const char* label, const unsigned char* data, int len) {
    printf("%s (%d bytes):\n", label, len);
    for (int i = 0; i < len; ++i) {
        printf("%02x", data[i]);
    }
    printf("\n");
}

int main() {
    // 用于 SM3 摘要计算的示例数据
    const uint8_t *msg = (const uint8_t *)"abc";
    uint8_t hash[SM3_HASH_SIZE];

    printf("----------------------------------------\n");
    printf("1. SM3 Hashing\n");
    printf("----------------------------------------\n");

    // SM3 上下文结构体（标准 GMSSL 类型）
    SM3_CTX sm3_ctx; 
    
    // 初始化、更新、结束 (Init, Update, Finish)
    sm3_init(&sm3_ctx);
    sm3_update(&sm3_ctx, msg, strlen((char*)msg));
    sm3_finish(&sm3_ctx, hash); // 函数名修正：sm3_final -> sm3_finish

    printf("Message: %s\n", msg);
    print_hex("SM3 Hash", hash, SM3_HASH_SIZE);

    printf("----------------------------------------\n");
    printf("2. SM3-HMAC Hashing\n");
    printf("----------------------------------------\n");

    // 用于 HMAC 的密钥
    const uint8_t key[HMAC_KEY_SIZE] = "0123456789abcdef"; // 16字节示例密钥
    uint8_t hmac[SM3_HASH_SIZE];

    // SM3 HMAC 上下文结构体（标准 GMSSL 类型）
    SM3_HMAC_CTX hmac_ctx; 
    
    // 初始化 HMAC（需要密钥和密钥长度）
    sm3_hmac_init(&hmac_ctx, key, HMAC_KEY_SIZE);

    // 更新 HMAC 数据
    sm3_hmac_update(&hmac_ctx, msg, strlen((char*)msg));

    // 结束 HMAC 计算
    sm3_hmac_finish(&hmac_ctx, hmac); // 函数名修正：sm3_hmac_final -> sm3_hmac_finish

    print_hex("HMAC Key", key, HMAC_KEY_SIZE);
    printf("Message: %s\n", msg);
    print_hex("SM3 HMAC", hmac, SM3_HASH_SIZE);

    return 0;
}
